<?php
/**
 * @category   Fencer
 * @package    Fencer_View
 * @subpackage Fencer_View_Helper
 * @copyright  Copyright (c) 2012 FencerWeb
 * @version $Id:
 */

require_once 'Zend/View/Helper/Abstract.php';
class Fencer_View_Helper_FencerHtmlElements extends Zend_View_Helper_Abstract
{
	//Atributos
	const F_HTML_ATTR_TYPE      = 'type';
	const F_HTML_ATTR_ID   	    = 'id';
	const F_HTML_ATTR_NAME 	    = 'name';
	const F_HTML_ATTR_CLASS 	= 'class';
	const F_HTML_ATTR_VALUE 	= 'value';
	const F_HTML_ATTR_STYLE 	= 'style';
	const F_HTML_ATTR_SIZE 	    = 'size';
	const F_HTML_ATTR_MAXLENGTH = 'maxlength';
	const F_HTML_ATTR_READONLY  = 'readonly';
	const F_HTML_ATTR_DISABLED  = 'disabled';
	const F_HTML_ATTR_TITLE 	= 'title';
	const F_HTML_ATTR_ACCEPT	= 'accept';
	const F_HTML_ATTR_ALIGN	    = 'align';
	const F_HTML_ATTR_ALT	    = 'alt';
	const F_HTML_ATTR_CHECKED	= 'checked';
	const F_HTML_ATTR_SRC	    = 'src';
	const F_HTML_ATTR_FOR	    = 'for';

	//Atributos de evento
	const F_HTML_ATTR_EVENT_ONBLUR   	= 'onblur';
	const F_HTML_ATTR_EVENT_ONCHANGE	= 'onchange';
	const F_HTML_ATTR_EVENT_ONCLICK	    = 'onclick';
	const F_HTML_ATTR_EVENT_ONDBLCLICK	= 'ondblclick';
	const F_HTML_ATTR_EVENT_ONFOCUS  	= 'onfocus';
	const F_HTML_ATTR_EVENT_ONMOUSEDOWN	= 'onmousedown';
	const F_HTML_ATTR_EVENT_ONMOUSEMOVE	= 'onmousemove';
	const F_HTML_ATTR_EVENT_ONMOUSEOUT	= 'onmouseout';
	const F_HTML_ATTR_EVENT_ONMOUSEOVER	= 'onmouseover';
	const F_HTML_ATTR_EVENT_ONMOUSEUP	= 'onmouseup';
	const F_HTML_ATTR_EVENT_ONKEYDOWN	= 'onkeydown';
	const F_HTML_ATTR_EVENT_ONKEYPRESS	= 'onkeypress';
	const F_HTML_ATTR_EVENT_ONKEYUP  	= 'onkeyup';
	const F_HTML_ATTR_EVENT_ONSELECT	= 'onselect';
	
	//Elemento criado para injetar textos nos elementos html
	const F_HTML_EXIBE_TEXTO = 'texto';
	
	//Types da Tag Input
	const F_INPUT_TYPE_BUTTON   = 'button';
	const F_INPUT_TYPE_CHECKBOX = 'checkbox';
	const F_INPUT_TYPE_FILE     = 'file';
	const F_INPUT_TYPE_HIDDEN   = 'hidden';
	const F_INPUT_TYPE_IMAGE    = 'image';
	const F_INPUT_TYPE_PASSWORD = 'password';
	const F_INPUT_TYPE_RADIO    = 'radio';
	const F_INPUT_TYPE_RESET    = 'reset';
	const F_INPUT_TYPE_SUBMIT   = 'submit';
	const F_INPUT_TYPE_TEXT     = 'text';
	
	/**
	 * Type.
	 * @var string 
	 */
	private $_type;
	
	/**
	 * Id.
	 * @var string 
	 */
	private $_id;	
	
	/**
	 * Name.
	 * @var string
	 */
	private $_name;
	
	/**
	 * Size.
	 * @var string
	 */
	private $_size;
	
	/**
	 * Value.
	 * @var string
	 */
	private $_value;	
	
	/**
	 * Maxlength.
	 * @var string
	 */
	private $_maxLength;
	
	/**
	 * ReadOnly.
	 * @var string
	 */
	private $_readOnly;
	
	/**
	 * Disabled.
	 * @var string
	 */
	private $_disabled;	
	
	/**
	 * Title.
	 * @var string
	 */
	private $_title;	
	
	/**
	 * Accept.
	 * @var string
	 */
	private $_accept;	
	
	/**
	 * Align.
	 * @var string
	 */
	private $_align;	
	
	/**
	 * Alt.
	 * @var string
	 */
	private $_alt;	
	
	/**
	 * Checked.
	 * @var string
	 */
	private $_checked;	
	
	/**
	 * Src.
	 * @var string
	 */
	private $_src;	
	
	/**
	 * For.
	 * @var string
	 */
	private $_for;	
	
	/**
	 * OnBlur.
	 * @var string
	 */
	private $_onBlur;
	
	/**
	 * OnChange.
	 * @var string
	 */
	private $_onChange;	
	
	/**
	 * OnClick.
	 * @var string
	 */
	private $_onClick;		
	
	/**
	 * OnDblclick.
	 * @var string
	 */
	private $_onDblclick;

	/**
	 * OnFocus.
	 * @var string
	 */
	private $_onFocus;

	/**
	 * OnMousemove.
	 * @var string
	 */
	private $_onMousemove;

	/**
	 * OnMousedown.
	 * @var string
	 */
	private $_onMousedown;

	/**
	 * OnMouseout.
	 * @var string
	 */
	private $_onMouseout;

	/**
	 * OnMouseover.
	 * @var string
	 */
	private $_onMouseover;

	/**
	 * OnMouseup.
	 * @var string
	 */
	private $_onMouseup;

	/**
	 * OnMousedown.
	 * @var string
	 */
	private $_onKeydown;

	/**
	 * OnMousepress.
	 * @var string
	 */
	private $_onKeypress;

	/**
	 * OnMouseup.
	 * @var string
	 */
	private $_onKeyup;
	
	/**
	 * OnSelect.
	 * @var string
	 */
	private $_onSelect;	
	
	/**
	 * Texto.
	 * @var string
	 */
	private $_texto;	
		
	/**
	 * Class.
	 * @var array
	 */
	private $_class = array();

	/**
	 * Style.
	 * @var array
	 */
	private $_style = array();
		
	/**
	 * Adiciona configuração.
	 * @var array
	 */
	private $_adicionaConfig = array();

	/**
	 * Remove configuração.
	 * @var array
	 */
	private $_removeConfig = array();		
	
	/**
	 * Serão armazenados os atributos não encontrados 
	 * nos parâmetros de configuração 
	 */
	private $_atribNaoEncontrado = array();

	/**
	 * Serão armazenados os atributos não encontrados do config de remoção
	 * nos parâmetros de configuração 
	 */
	private $_atribRemocaoNaoEncontrado = array();
	
	/**
	 * Serão armazenados todos os atributos já validadeos
	 */
	private $_atributos = array();	
	
	/**
	 * Seta o $_type
	 * @param String $_type
	 */
	public function setType($type) {
		if(empty($type) || is_null($type)){
			$this->_type = null;
			
		}else{
			$this->_setAtributo($this->_type = "type=\"{$type}\"");
			
		}
	}	
	/**
	 * Pega o $_type
	 * @return String $_type
	 */
	public function getType() {
		return $this->_type;
	}
		
	/**
	 * Seta o $_id
	 * @param String $_id
	 */
	public function setId($id) {
		if(empty($id) || is_null($id)){
			$this->_id = null;
			
		}else{
			$name = $this->getName();
			if(empty($name) || is_null($name)){
				$this->setName($id);
			}
			$this->_setAtributo($this->_id = "id=\"{$id}\"");
			
		}
	}	
	/**
	 * Pega o $_id
	 * @return String $_id
	 */
	public function getId() {
		return $this->_id;
	}
	
	/**
	 * Seta o $_name
	 * @param String $_name
	 */
	public function setName($name){
		if(empty($name) || is_null($name)){
			$name = $this->getId();	
			//verifica se o id é nulo
			if(empty($name) || is_null($name)){
				$this->_name = null;		
			}
		}else{
			$this->_setAtributo($this->_name = "name=\"{$name}\"");
			
		}
	}
	
	/**
	 * Pega o $_name
	 * @return String $_name
	 */
	public function getName() {
		return $this->_name;
	}	

	/**
	 * Seta o $_size
	 * @param String $_size
	 */
	public function setSize($size) {
		if(empty($size) || is_null($size)){
			$this->_size = null;
			
		}else{
			$this->_setAtributo($this->_size = "size=\"{$size}\"");
			
		}
	}
	
	/**
	 * Pega o $_size
	 * @return String $_size
	 */
	public function getSize() {
		return $this->_size;
	}	
	
	/**
	 * Seta o $_value
	 * @param String $_value
	 */
	public function setValue($value) {
		if(empty($value) || is_null($value)){
			$this->_value = null;
		
		}else{
			$this->_setAtributo($this->_value = "value=\"{$value}\"");	
				
		}
	}
	
	/**
	 * Pega o $_value
	 * @return String $_value
	 */
	public function getValue() {
		return $this->_value;
	}
	
	/**
	 * Seta o $_maxLength
	 * @param String $_maxLength
	 */
	public function setMaxLength($maxLength) {
		if(empty($maxLength) || is_null($maxLength)){
			$this->_maxLength = null;
			
		}else{
			$this->_setAtributo($this->_maxLength = "maxlength=\"{$maxLength}\"");	
			
		}
	}
	
	/**
	 * Pega o $_maxLength
	 * @return String $_maxLength
	 */
	public function getMaxLength() {
		return $this->_maxLength;
	}
	
	/**
	 * Seta o $_readOnly
	 * @param String $_readOnly
	 */
	public function setReadOnly($readOnly) {
		if(empty($readOnly) || is_null($readOnly)){
			$this->_readOnly = null;
			
		}else{
			$this->_setAtributo($this->_readOnly = "readonly=\"{$readOnly}\"");
			
		}
	}
	
	/**
	 * Pega o $_readOnly
	 * @return String $_readOnly
	 */
	public function getReadOnly() {
		return $this->_readOnly;
	}	

	/**
	 * Seta o $_disabled
	 * @param String $_disabled
	 */
	public function setDisabled($disabled) {
		if(empty($disabled) || is_null($disabled)){
			$this->_disabled = null;
			
		}else{
			$this->_setAtributo($this->_disabled = "disable=\"{$disabled}\"");
			
		}
	}
	
	/**
	 * Pega o $_disabled
	 * @return String $_disabled
	 */
	public function getDisabled() {
		return $this->_disabled;	
	}	

	/**
	 * Seta o $_title
	 * @param String $_title
	 */
	public function setTitle($title) {
		if(empty($title) || is_null($title)){
			$this->_title = null;
			
		}else{
			$this->_setAtributo($this->_title = "title=\"{$title}\"");
			
		}
	}
	
	/**
	 * Pega o $_title
	 * @return String $_title
	 */
	public function getTitle() {
		return $this->_title;	
	}	

	/**
	 * Seta o $_accept
	 * @param String $_accept
	 */
	public function setAccept($accept) {
		if(empty($accept) || is_null($accept)){
			$this->_accept = null;
			
		}else{
			$this->_setAtributo($this->_accept = "accept=\"{$accept}\"");
			
		}
	}
	
	/**
	 * Pega o $_accept
	 * @return String $_accept
	 */
	public function getAccept() {
		return $this->_accept;	
	}	

	/**
	 * Seta o $_align
	 * @param String $_align
	 */
	public function setAlign($align) {
		if(empty($align) || is_null($align)){
			$this->_align = null;
			
		}else{
			$this->_setAtributo($this->_align = "align=\"{$align}\"");
			
		}
	}
	
	/**
	 * Pega o $_align
	 * @return String $_align
	 */
	public function getAlign() {
		return $this->_align;	
	}	

	/**
	 * Seta o $_alt
	 * @param String $_alt
	 */
	public function setAlt($alt) {
		if(empty($alt) || is_null(alt)){
			$this->_alt = null;
			
		}else{
			$this->_setAtributo($this->_alt = "alt=\"{$alt}\"");
			
		}
	}
	
	/**
	 * Pega o $_alt
	 * @return String $_alt
	 */
	public function getAlt() {
		return $this->_alt;	
	}	

	/**
	 * Seta o $_checked
	 * @param String $_checked
	 */
	public function setChecked($checked) {
		if(empty($checked) || is_null($checked)){
			$this->_checked = null;
			
		}else{
			$this->_setAtributo($this->_checked = "checked=\"{$checked}\"");
			
		}
	}
	
	/**
	 * Pega o $_checked
	 * @return String $_checked
	 */
	public function getChecked() {
		return $this->_checked;	
	}	

	/**
	 * Seta o $_src
	 * @param String $_src
	 */
	public function setSrc($src) {
		if(empty($src) || is_null($src)){
			$this->_src = null;
			
		}else{
			$this->_setAtributo($this->_src = "src=\"{$src}\"");
			
		}
	}
	
	/**
	 * Pega o $_src
	 * @return String $_src
	 */
	public function getSrc() {
		return $this->_src;	
	}	
	
	
	/**
	 * Seta o $_for
	 * @param String $_s$_forrc
	 */
	public function setFor($for) {
		if(empty($for) || is_null($for)){
			$this->_for = null;
				
		}else{
			$this->_setAtributo($this->_for = "for=\"{$for}\"");
				
		}
	}
	
	/**
	 * Pega o $_for
	 * @return String $_for
	 */
	public function getFor() {
		return $this->_for;
	}	
	
	/**
	 * Seta o $_onBlur
	 * @param String $_onBlur
	 */
	public function setOnBlur($onBlur) {
		if(empty($onBlur) || is_null($onBlur)){
			$this->_onBlur = null;
			
		}else{
			$this->_setAtributo($this->_onBlur = "onblur=\"{$onBlur}\"");
			
		}
	}
	
	/**
	 * Pega o $_onBlur
	 * @return String $_onBlur
	 */
	public function getOnBlur() {
		return $this->$onBlur;	
	}	
	
	/**
	 * Seta o $_onChange
	 * @param String $_onChange
	 */
	public function setOnChange($onChange) {
		if(empty($onChange) || is_null($onChange)){
			$this->_onChange = null;
			
		}else{
			$this->_setAtributo($this->_onChange = "onchange=\"{$onChange}\"");
			
		}
	}
	
	/**
	 * Pega o $_onChange
	 * @return String $_onChange
	 */
	public function getOnChange() {
		return $this->_onChange;	
	}

	/**
	 * Seta o $_onClick
	 * @param String $_onClick
	 */
	public function setOnClick($onClick) {
		if(empty($onClick) || is_null($onClick)){
			$this->_onClick = null;	
			
		}else{
			$this->_setAtributo($this->_onClick = "onclic=\"{$onClick}\"");
			
		}
	}
	
	/**
	 * Pega o $_onClick
	 * @return String $_onClick
	 */
	public function getOnClick() {
		return $this->_onClick;	
	}

	/**
	 * Seta o $_onDblclick
	 * @param String $_onDblclick
	 */
	public function setOnDblclick($onDblclick) {
		if(empty($onDblclick) || is_null($onDblclick)){
			$this->_onDblclick = null;
			
		}else{
			$this->_setAtributo($this->_onDblclick = "ondblclick=\"{$onDblclick}\"");
			
		}
	}
	
	/**
	 * Pega o $_onDblclick
	 * @return String $_onDblclick
	 */
	public function getOnDblclick() {
		return $this->_onDblclick;	
	}

	/**
	 * Seta o $_onFocus
	 * @param String $_onFocus
	 */
	public function setOnFocus($onFocus) {
		if(empty($onFocus) || is_null($onFocus)){
			$this->_onFocus = null;
			
		}else{
			$this->_setAtributo($this->_onFocus = "onfocus=\"{$onFocus}\"");
			
		}
	}
	
	/**
	 * Pega o $_onFocus
	 * @return String $_onFocus
	 */
	public function getOnFocus() {
		return $this->_onFocus;	
	}	

	/**
	 * Seta o $_onMousemove
	 * @param String $_onMousemove
	 */
	public function setOnMousemove($onMousemove) {
		if(empty($onMousemove) || is_null($onMousemove)){
			$this->_onMousemove = null;
			
		}else{
			$this->_setAtributo($this->_onMousemove = "onmousemove=\"{$onMousemove}\"");
			
		}
	}
		
	/**
	 * Pega o $_onMousemove
	 * @return String $_onMousemove
	 */
	public function getOnMousemove() {
		return $this->_onMousemove;	
	}

	/**
	 * Seta o $_onMousedown
	 * @param String $_onMousedown
	 */
	public function setOnMousedown($onMousedown) {
		if(empty($onMousedown) || is_null($onMousedown)){
			$this->_onMousedown = null;
			
		}else{
			$this->_setAtributo($this->_onMousedown = "onmousedown=\"{$onMousedown}\"");
			
		}
	}	
	
	/**
	 * Pega o $_onMousedown
	 * @return String $_onMousedown
	 */
	public function getOnMousedown() {
		return $this->_onMousedown;	
	}

	/**
	 * Seta o $_onMouseout
	 * @param String $_onMouseout
	 */
	public function setOnMouseout($onMouseout) {
		if(empty($onMouseout) || is_null($onMouseout)){
			$this->_onMouseout = null;
			
		}else{
			$this->_setAtributo($this->_onMouseout = "onmouseout=\"{$onMouseout}\"");
			
		}
	}
	
	/**
	 * Pega o $_onMouseout
	 * @return String $_onMouseout
	 */
	public function getOnMouseout() {
		return $this->_onMouseout;	
	}
	
	/**
	 * Seta o $_onMouseover
	 * @param String $_onMouseover
	 */
	public function setOnMouseover($onMouseover) {
		if(empty($onMouseover) || is_null($onMouseover)){
			$this->_onMouseover = null;
			
		}else{
			$this->_setAtributo($this->_onMouseover = "onmouseover=\"{$onMouseover}\"");
			
		}
	}
	
	/**
	 * Pega o $_onMouseover
	 * @return String $_onMouseover
	 */
	public function getOnMouseover() {
		return $this->_onMouseover;	
	}	
	
	/**
	 * Seta o $_onMouseup
	 * @param String $_onMouseup
	 */
	public function setOnMouseup($onMouseup) {
		if(empty($onMouseup) || is_null($onMouseup)){
			$this->_onMouseup = null;
			
		}else{
			$this->_setAtributo($this->_onMouseup = "onmouseup=\"{$onMouseup}\"");
			
		}
	}
	
	/**
	 * Pega o $_onMouseup
	 * @return String $_onMouseup
	 */
	public function getOnMouseup() {
		return $this->_onMouseup;	
	}	
	
	/**
	 * Seta o $_onKeydown
	 * @param String $_onKeydown
	 */
	public function setOnKeydown($onKeydown) {
		if(empty($onKeydown) || is_null($onKeydown)){
			$this->_onKeydown = null;
			
		}else{
			$this->_setAtributo($this->_onKeydown = "onkeydown=\"{$onKeydown}\"");
			
		}
	}
	
	/**
	 * Pega o $_onKeydown
	 * @return String $_onKeydown
	 */
	public function getOnKeydown() {
		return $this->_onKeydown;	
	}

	/**
	 * Seta o $_onKeypress
	 * @param String $_onKeypress
	 */
	public function setOnKeypress($onKeypress) {
		if(empty($onKeypress) || is_null($onKeypress)){
			$this->_onKeypress = null;
			
		}else{
			$this->_setAtributo($this->_onKeypress = "onkeypress=\"{$onKeypress}\"");
			
		}
	}
	
	/**
	 * Pega o $_onKeypress
	 * @return String $_onKeypress
	 */
	public function getOnKeypress() {
		return $this->_onKeypress;	
	}
	
	/**
	 * Seta o $_onKeyup
	 * @param String $_onKeyup
	 */
	public function setOnKeyup($onKeyup) {
		if(empty($onKeyup) || is_null($onKeyup)){
			$this->_onKeyup = null;
			
		}else{
			$this->_setAtributo($this->_onKeyup = "onkeyup=\"{$onKeyup}\"");
			
		}
	}
	
	/**
	 * Pega o $_onKeyup
	 * @return String $_onKeyup
	 */
	public function getOnKeyup() {
		return $this->_onKeyup;	
	}

	/**
	 * Seta o $_onSelect
	 * @param String $_onSelect
	 */
	public function setOnSelect($onSelect) {
		if(empty($onSelect) || is_null($onSelect)){
			$this->_onSelect = null;
			
		}else{
			$this->_setAtributo($this->_onSelect = "onselect=\"{$onSelect}\"");
			
		}
	}
	
	/**
	 * Pega o $_onSelect
	 * @return String $_onSelect
	 */
	public function getOnSelect() {
		return $this->_onSelect;	
	}

	/**
	 * Seta o $_texto
	 * @param String $_texto
	 */
	public function setTexto($texto) {
		if(empty($texto) || is_null($texto)){
			$this->_texto = null;
				
		}else{
			$this->_texto = $texto;
				
		}
	}
	
	/**
	 * Pega o $_texto
	 * @return String $_texto
	 */
	public function getTexto() {
		return $this->_texto;
	}	
	
	/**
	 * Seta o $_class
	 * @param array $_class
	 */
	public function setClass($class) {
		if(empty($class) || is_null($class)){
			$this->_class = null;		
			
		}else{
			$classes = implode(' ', $class);
			$this->_setAtributo($this->_class = "class=\"{$classes}\"");		
			
		}
	}
	
	/**
	 * Pega o $_class
	 * @return array $_class
	 */
	public function getClass() {
		return $this->_class;
	}
	
	/**
	 * Seta o $_style
	 * @param array $_style
	 */
	public function setStyle($style) {
		if(empty($style) || is_null($style)){
				$this->_style = null;
			
		}else{
			foreach ($style AS $elem ){
				$css .= $elem . ';';		
			}
			$this->_setAtributo($this->_style = "style=\"{$css}\"");
			
		}
	}
	
	/**
	 * Pega o $_style
	 * @return array $_style
	 */
	public function getStyle() {
		return $this->_style;
	}	
	
	/**
	 * Seta o $_adicionaConfig
	 * @param array $_adicionaConfig
	 */
	public function setAdicionaConfig($adicionaConfig) {
		if(empty($adicionaConfig) || is_null($adicionaConfig)){
			$this->_adicionaConfig = null;
			
		}else{
			if(!is_array($adicionaConfig)){
				$msg = "O primeiro parâmentro do Helper deve ser um array de configuração.<br />
						Exemplo: array('type' => 'text', 'style' => array('width:50px','color:red')).";
				$this->erroExigeArray($msg);	
			}
			
			$this->_adicionaConfig = $adicionaConfig;
			$this->_setAtributosConfig();
			
		}
	}
	
	/**
	 * Pega o $_adicionaConfig
	 * @return array $_adicionaConfig
	 */
	public function getAdicionaConfig() {
		return $this->_adicionaConfig;
	}
	
	/**
	 * Seta o $_removeConfig
	 * @param array $_removeConfig
	 */
	public function setRemoveConfig($removeConfig) {
		if(empty($removeConfig) || is_null($removeConfig)){
			$this->_removeConfig = null;
			
		}else{
			if(!is_array($removeConfig)){
				$msg = "O segundo parâmentro do Helper deve ser um array de configuração.<br />
						Exemplo: array('type' => 'text', 'style' => array('width:50px','color:red')).";
				$this->erroExigeArray($msg);	
			}
			
			$this->_removeConfig = $removeConfig;
			//verifica se os atributos de remoção são válidos
			$this->_verificaValidadeRemoveAtributos();
			
		}
	}
	
	/**
	 * Pega o $_removeConfig
	 * @return array $_removeConfig
	 */
	public function getRemoveConfig() {
		return $this->_removeConfig;
	}

	/**
	 * 
	 * Seta o $_atributo
	 * @param Persiste os atributos já validados
	 */
	private function _setAtributo($atributo){
		if(!empty($atributo) && !is_null($atributo)){
			$this->_atributos[] = $atributo;
			
		}
	}
	
	/**
	 * Pega o $_atributo
	 * @return array $_atributo
	 */
	public function getAtributo(){
		return $this->_atributos;
	}
	
	/**
	 * Seta o $_atribNaoEncontrado
	 * @param array $_atribNaoEncontrado
	 */
	private function _setAtribNaoEncontrado($atribNaoEncontrado) {
		if(empty($atribNaoEncontrado) || is_null($atribNaoEncontrado)){
			$this->_atribNaoEncontrado = null;
			
		}else{
			$this->_atribNaoEncontrado[] = $atribNaoEncontrado;
				
		}
	}
	
	/**
	 * Pega o $_atribNaoEncontrado
	 * @return array $_atribNaoEncontrado
	 */
	private function _getAtribNaoEncontrado() {
		return $this->_atribNaoEncontrado;
	}	
	
	/**
	 * Seta o $_atribRemocaoNaoEncontrado
	 * @param array $_atribRemocaoNaoEncontrado
	 */
	private function _setAtribRemocaoNaoEncontrado($atribRemocaoNaoEncontrado) {
		if(empty($atribRemocaoNaoEncontrado) || is_null($atribRemocaoNaoEncontrado)){
			$this->_atribRemocaoNaoEncontrado = null;
			
		}else{
			$this->_atribRemocaoNaoEncontrado[] = $atribRemocaoNaoEncontrado;
				
		}
	}
	
	/**
	 * Pega o $_atribRemocaoNaoEncontrado
	 * @return array $_atribRemocaoNaoEncontrado
	 */
	private function _getAtribRemocaoNaoEncontrado() {
		return $this->_atribRemocaoNaoEncontrado;
	}		
	
	/**
	 * 
	 * Persiste todos os atributos informados e faz a validação dos mesmos
	 * @return void
	 */
	private function _setAtributosConfig(){
		$config = $this->getAdicionaConfig();

		foreach ($config AS $atrib=>$valor){
			if(is_int($atrib)){
				$msg = "Os config de configuração deve ser um array associativo.<br />
						<strong>Exemplo: array('type'=>'text','style'=>array('width:50px').</strong>";
				$this->erroExigeArray($msg);
			}
			switch ($atrib){
				case self::F_HTML_ATTR_TYPE:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_TYPE,$valor);
					$this->setType($valor);
				
					break;
								
				case self::F_HTML_ATTR_ID:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_ID,$valor);
					$this->setId($valor);
				
					break;

				case self::F_HTML_ATTR_NAME:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_NAME,$valor);
					$this->setName($valor);
				
					break;

				case self::F_HTML_ATTR_CLASS:
					if(!is_array($valor)){
						$msg = "No config de elementos o atributo <strong>class</strong> deve ser no formato de array.<br />
								<strong>Exemplo: array('class' => array('class1','class2')).";
						$this->erroExigeArray($msg);	
					}
					
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_CLASS,$valor);
					$this->setClass($valor);
				
					break;

				case self::F_HTML_ATTR_VALUE:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_VALUE,$valor);
					$this->setValue($valor);
				
					break;

				case self::F_HTML_ATTR_STYLE:
					if(!is_array($valor)){
						$msg = "No config de elementos o atributo <strong>style</strong> deve ser no formato de array.<br />
						<strong>Exemplo: array('style' => array('width:50px','color:red')).";
						$this->erroExigeArray($msg);
					}
										
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_STYLE,$valor);
					$this->setStyle($valor);
				
					break;

				case self::F_HTML_ATTR_SIZE:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_SIZE,$valor);
					$this->setSize($valor);
				
					break;

				case self::F_HTML_ATTR_MAXLENGTH:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_MAXLENGTH,$valor);
					$this->setMaxLength($valor);
				
					break;

				case self::F_HTML_ATTR_READONLY:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_READONLY,$valor);
					$this->setReadOnly($valor);
				
					break;

				case self::F_HTML_ATTR_DISABLED:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_DISABLED,$valor);
					$this->setDisabled($valor);
				
					break;

				case self::F_HTML_ATTR_TITLE:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_TITLE,$valor);
					$this->setTitle($valor);
				
					break;

				case self::F_HTML_ATTR_ACCEPT:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_ACCEPT,$valor);
					$this->setAccept($valor);
				
					break;

				case self::F_HTML_ATTR_ALIGN:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_ALIGN,$valor);
					$this->setAlign($valor);
				
					break;

				case self::F_HTML_ATTR_ALT:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_ALT,$valor);
					$this->setAlign($valor);
				
					break;

				case self::F_HTML_ATTR_CHECKED:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_CHECKED,$valor);
					$this->setChecked($valor);
				
					break;

				case self::F_HTML_ATTR_SRC:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_SRC,$valor);
					$this->setSrc($valor);
				
					break;
					
					
				case self::F_HTML_ATTR_FOR:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_FOR,$valor);
					$this->setFor($valor);
				
					break;					
				
				case self::F_HTML_ATTR_EVENT_ONBLUR:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONBLUR,$valor);
					$this->setOnBlur($valor);
				
					break;	
				
				case self::F_HTML_ATTR_EVENT_ONCHANGE:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONCHANGE,$valor);
					$this->setOnChange($valor);
				
					break;	
				
				case self::F_HTML_ATTR_EVENT_ONCLICK:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONCLICK,$valor);
					$this->setOnClick($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONDBLCLICK:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONDBLCLICK,$valor);
					$this->setOnDblclick($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONFOCUS:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONFOCUS,$valor);
					$this->setOnFocus($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONMOUSEDOWN:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_TYPE,$valor);
					$this->setOnMousedown($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONMOUSEMOVE:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONMOUSEDOWN,$valor);
					$this->setOnMousemove($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONMOUSEOUT:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONMOUSEOUT,$valor);
					$this->setOnMouseout($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONMOUSEOVER:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONMOUSEOVER,$valor);
					$this->setOnMouseover($valor);
				
					break;	
				
				case self::F_HTML_ATTR_EVENT_ONMOUSEUP:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONMOUSEUP,$valor);
					$this->setOnMouseup($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONKEYDOWN:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONKEYDOWN,$valor);
					$this->setOnKeydown($valor);
				
					break;	
				
				case self::F_HTML_ATTR_EVENT_ONKEYPRESS:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONKEYPRESS,$valor);
					$this->setOnKeypress($valor);
				
					break;	

				case self::F_HTML_ATTR_EVENT_ONKEYUP:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONKEYUP,$valor);
					$this->setOnKeyup($valor);
				
					break;
									
				case self::F_HTML_ATTR_EVENT_ONSELECT:
					$valor = $this->_setRemoveAtributos(self::F_HTML_ATTR_EVENT_ONSELECT,$valor);
					$this->setOnSelect($valor);
					
					break;

				case self::F_HTML_EXIBE_TEXTO:
					$valor = $this->_setRemoveAtributos(self::F_HTML_EXIBE_TEXTO,$valor);
					$this->setTexto($valor);
						
					break;
						
				default:
					$this->_setAtribNaoEncontrado($atrib);
							
				break;
			}
		}
		//verifica se algum atrib inválido foi passado
		$this->_verificaAtributosInvalidos();

	}
	
	/**
	 * 
	 * Verifica se os atributos passados no array de atributos que serão removidos são válidos
	 * @return void
	 */
	private function _verificaValidadeRemoveAtributos(){
		$config = $this->getRemoveConfig();
		//verifica o style quando for um array
		if(key_exists($this->F_HTML_ATTR_STYLE, $config)){
			if(is_array($config[$this->F_HTML_ATTR_STYLE])){
				unset($config[$this->F_HTML_ATTR_STYLE]);
			}else{
				$msg = "O array de remoção deve receber o atritubo style no formato de array ou como chave
						única dentro do array de remoção.<br />
						<strong>Exemplo: array('style'=>'width:50px') ou array('style,size').</strong>";
				$this->erroExigeArray($msg);
			}
		}
		//verifica a class quando for um array
		if(key_exists($this->F_HTML_ATTR_CLASS, $config)){
			if(is_array($config[$this->F_HTML_ATTR_CLASS])){
				unset($config[$this->F_HTML_ATTR_CLASS]);
			}else{
				$msg = "O array de remoção deve receber o atritubo class no formato de array ou como chave
				única dentro do array de remoção.<br />
				<strong>Exemplo: array('class'=>'class1') ou array('class,size').</strong>";
				$this->erroExigeArray($msg);
			}
		}
		
		foreach ($config AS $i=>$atrib){
			switch($config[$i]){
				case self::F_HTML_ATTR_TYPE:
					break;
				
				case self::F_HTML_ATTR_ID:
					break;
				
				case self::F_HTML_ATTR_NAME:
					break;
				
				case self::F_HTML_ATTR_CLASS:
					break;
				
				case self::F_HTML_ATTR_VALUE:
					break;
				
				case self::F_HTML_ATTR_STYLE:
					break;
				
				case self::F_HTML_ATTR_SIZE:
					break;
				
				case self::F_HTML_ATTR_MAXLENGTH:
					break;
				
				case self::F_HTML_ATTR_READONLY:
					break;
				
				case self::F_HTML_ATTR_DISABLED:
					break;
				
				case self::F_HTML_ATTR_TITLE:
					break;
				
				case self::F_HTML_ATTR_ACCEPT:
					break;
				
				case self::F_HTML_ATTR_ALIGN:
					break;
				
				case self::F_HTML_ATTR_ALT:
					break;
				
				case self::F_HTML_ATTR_CHECKED:
					break;
				
				case self::F_HTML_ATTR_SRC:
					break;
					
				case self::F_HTML_ATTR_FOR:
					break;					
				
				case self::F_HTML_ATTR_EVENT_ONBLUR:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONCHANGE:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONCLICK:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONDBLCLICK:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONFOCUS:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONMOUSEDOWN:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONMOUSEMOVE:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONMOUSEOUT:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONMOUSEOVER:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONMOUSEUP:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONKEYDOWN:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONKEYPRESS:
					break;
				
				case self::F_HTML_ATTR_EVENT_ONKEYUP:
					break;
						
				case self::F_HTML_ATTR_EVENT_ONSELECT:
					break;
					
				default:
						
					$this->_setAtribRemocaoNaoEncontrado($atrib);
						
					break;
				}
			}
			//verifica se algum atrib inválido foi passado
			$this->_verificaAtributosRemocaoInvalidos();
	}	
	
	/**
	 * 
	 * Compara os atributos do config com os atributos do removeConfig
	 * Em caso de duplicidade então esse atributo será removido
	 * @param String $atributo
	 * @param String || array $valor
	 */
	protected function _setRemoveAtributos($atributo, $valor){
		$configRemove = $this->getRemoveConfig();

		if(!empty($configRemove) || !is_null($configRemove)){
			//se vier array por exemplo nos casos de classes ou style
			if(is_array($valor)){
				foreach ($valor AS $i => $val){
					$val = $this->_formataString($val);
					//verifica se existe o atributo para o array de remoção
					if(!empty($configRemove[$atributo])){
						foreach ($configRemove[$atributo] AS $v){
							$v = $this->_formataString($v);
							//verifica se os valores do config e do remove config são iguais
							//só chega nesse ponto se os atribs forem comuns nos dois configs
							if(strcmp($val, $v) == 0){
								unset($valor[$i]);
							}
						}
						//verifica se em alguma posição do array existe o atributo
					}elseif(in_array($atributo, $configRemove)){
						return null;
					}
				}
				return $valor;
					
			}else{
			
				//se forem igual então o retorno é do tipo null
				if(in_array($atributo, $configRemove)){
					return null;
				}else{
					return $valor;
				}
			}
		}else{
			return $valor;
		}
		
	}
	
	/**
	 * 
	 * Formata uma string para possibilitar a validação e comparação da mesma
	 * @param String $str
	 * @return String $str
	 */
	protected function _formataString($str){
		$str = str_replace(' ', '', $str);
		$str = strtolower($str);	

		return $str;
	}
	
	/**
	 * 
	 * Retorna um array com os types da tag input
	 * @return array $types
	 */
	public function getArrayTypeTagInput(){
		$types[] = "type=\"" . self::F_INPUT_TYPE_BUTTON . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_CHECKBOX . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_FILE . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_HIDDEN . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_IMAGE . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_PASSWORD . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_RADIO . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_RESET . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_SUBMIT . "\"";
		$types[] = "type=\"" . self::F_INPUT_TYPE_TEXT . "\"";
		
		return $types;
	}
	
	/**
	 * 
	 * Método responsável por verifica se os atributos informados no config são válidos
	 * @return boolean
	 */
	private function _verificaAtributosInvalidos(){
		$atribs = $this->_getAtribNaoEncontrado();
		
		if(!empty($atribs)){
			$this->erroAtributosInvalidos($atribs);
			return false;
		}
		
		return true;
		
	}
	
	/**
	 * 
	 * Método responsável por verifica se os atributos informados no config de remoção são válidos
	 * @return boolean
	 */
	private function _verificaAtributosRemocaoInvalidos(){
		$atribs = $this->_getAtribRemocaoNaoEncontrado();
		if(!empty($atribs)){
			$this->erroAtributosInvalidos($atribs);
			return false;
		}
		
		return true;
		
	}	
	
	/**
	 * 
	 * Gera a tela de erro exibindo os atribs inválidos
	 * @param array $atribs
	 * @return void
	 */
	public function erroAtributosInvalidos($atribs){
		$css = $this->getCssTelasDeErro();
		
		$retorno  .= "<fieldset class=\"fieldset-erro-atribs\" style=\"{$css['fieldset']}\">";
		$retorno  .= "<legend id=\"conteudo-nome\" style=\"{$css['legend']}\">Erro - Atributo(s) Inválido(s)</legend>";
		$retorno  .= "<div>";
		
		foreach ($atribs AS $atrib){
			$retorno .= "<span style=\"white-space: nowrap;\">O atributo <strong>\"{$atrib}\"</strong> foi definido icorretamente.</span><br />";
		}
		
		$retorno .= "</div>";
		$retorno .= "</fieldset>";
		
		echo $retorno;
		die();
		
	}
	
	/**
	 * 
	 * Gera a tela de erro informando que o atributo não é um array
	 * @param array $atribs
	 * @return void
	 */
	public function erroExigeArray($msg){
		$css = $this->getCssTelasDeErro();
		
		$retorno  .= "<fieldset class=\"fieldset-erro-atribs\" style=\"{$css['fieldset']}\">";
		$retorno  .= "<legend id=\"conteudo-nome\" style=\"{$css['legend']}\">Erro - Tipo de parâmetro inválido</legend>";
		$retorno  .= "<div>";
		
		$retorno .= "<span style=\"white-space: nowrap;\">{$msg}</span><br />";
		
		$retorno .= "</div>";
		$retorno .= "</fieldset>";
		
		echo $retorno;
		die();
		
	}
	
	/**
	 *
	 * Gera a tela de erro informando um valor é obrigatório
	 * @param array $atribs
	 * @return void
	 */
	public function erroExigeValor($msg){
		$css = $this->getCssTelasDeErro();
	
		$retorno  .= "<fieldset class=\"fieldset-erro-atribs\" style=\"{$css['fieldset']}\">";
		$retorno  .= "<legend id=\"conteudo-nome\" style=\"{$css['legend']}\">Erro - Valor Obrigatório</legend>";
		$retorno  .= "<div>";
	
		$retorno .= "<span style=\"white-space: nowrap;\">{$msg}</span><br />";
	
		$retorno .= "</div>";
		$retorno .= "</fieldset>";
	
		echo $retorno;
		die();
	
	}	
	
	/**
	 * 
	 * Gera os Css das telas de erro
	 * @return array
	 */
	public function getCssTelasDeErro(){
		$cssFieldset = "background: none repeat scroll 0 0 #F4F3EE;
						width: auto; 
						text-align:center;
						border: 1px solid silver;
						border-radius: 6px 6px 6px 6px;
						margin-bottom: 5px;
						margin-left: 15px;
						width: auto;
						padding: 2%; 
						display: block;
						-webkit-margin-start: 2px;
						-webkit-margin-end: 2px;
						-webkit-padding-before: 0.35em;
						-webkit-padding-start: 0.75em;
						-webkit-padding-end: 0.75em;
						-webkit-padding-after: 0.625em;";
		
		$cssLegend = "background: none repeat scroll 0 0 #323232;
						border-radius: 3px 3px 3px 3px;
						text-align: center;
						color: white;
						font-size: 60%;
						font-weight: bold;
						letter-spacing: 2px;
						padding: 2px 5px;
						text-transform: uppercase;
						display: block;
						-webkit-padding-start: 2px;
						-webkit-padding-end: 2px;
						border: none;
						border-image: initial;";
		
	return array('fieldset' => $cssFieldset, 'legend' => $cssLegend);

	}

}